/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package Aleatorio.Distribuciones;

/**
 *
 * @author Driv
 */
public class GeneradorNormal implements GeneradorAleatorio{
    
    private GeneradorUniforme generador;
    private boolean haySiguiente;
    private double siguiente;
    private double media;
    private double desviacion;
    
    public GeneradorNormal (int semilla){
        generador = new GeneradorUniforme(semilla);
        media = 0;
        desviacion = 1;
    }
    
    public GeneradorNormal (int semilla, double media, double desviacion){
        generador = new GeneradorUniforme(semilla);
        this.media = media;
        this.desviacion = desviacion;
    }

    public void setSemilla(int semilla) {
        generador.setSemilla(semilla);
    }

    public double siguiente() {
        double retorno;
        double rnd1 = 0;
        double rnd2 = 0;
        if (!haySiguiente){
            rnd1 = generador.siguiente();
            rnd2 = generador.siguiente();
            siguiente = (Math.sqrt(-2 * Math.log(1-rnd1)) * Math.sin(2 * Math.PI * rnd2));
            haySiguiente = true;
            retorno = (Math.sqrt(-2 * Math.log(1-rnd1)) * Math.cos(2 * Math.PI * rnd2));
        }
        else {
            retorno = siguiente;
            haySiguiente = false;
        }
        if (retorno > 9999999){
            double lala = rnd1;
            double lalala = rnd2;
            
            System.out.println("lalala");
        }
            
        return retorno*desviacion + media;
    }

}
